/*Copyright (C) 2009 - 2011 CAREIL Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

void at_signal(int sig_value) {
	endwin();
	fprintf(stderr, "Le programme a recus le signal %i : %s\n", sig_value, strerror(errno));
	exit(sig_value);
}

int init_indemodables() {
	short y = 25, ret = 0;
	char *fichier_verif[11] = {
		"dico.ini",
		CONFIG_FILENAME,
		POU_LVLS_EASY,
		POU_LVLS_INTER,
		POU_LVLS_MEDIUM,
		POU_LVLS_HARD,
		POU_LVLS_FUN,
		"playList.m3u",
		"credits.lst",
		"historiques.lst",
		NULL
	};
	char *dossier_verif[5] = {
		"scores",
		"niveaux",
		"niveaux/niveaux_perso",
		"sons",
		NULL
	};
	char info_maj[250];
	short boucleVerif = 0, i, progression = 0, barre_chargement[100];
	for(i = 0; i != 100; i++)
		barre_chargement[i] = COLOR_BLACK;
	memset(info_maj, 0, sizeof(info_maj));

	printf("\n Redirection des signaux : ");

	if(signal(SIGABRT, at_signal) == SIG_ERR ||
			signal(SIGFPE, at_signal) == SIG_ERR ||
			signal(SIGILL, at_signal) == SIG_ERR ||
			signal(SIGINT, at_signal) == SIG_ERR ||
			signal(SIGSEGV, at_signal) == SIG_ERR ||
			signal(SIGTERM, at_signal) == SIG_ERR) {
		printf("!!\n Des signaux n'ont pas pu etre redirigee vers la fonction at_signal!\n");
		getchar();
	}
	else {
		printf("OK\n");
	}

	if(init_curses() == false) { //init_curses est déclaré dans le curses/init.c
		endwin();
		printf("\n Initialisation de curses : !!\n");
		Log(LOG_DEFAULT, "L'initialisation de curses a échouée");
		return -1;
	}
	else {
		attron(A_BOLD);//Passage du texte en "gras" pour avoir des couleur claires sous Vista et Seven
		resize_term(40, DEFAULT_SCREEN_SIZE_X);//Redimentionne la console en 40*DEFAULT_SCREEN_SIZE_X
		for(i = progression; (i + 10) != progression; progression++)
			barre_chargement[progression] = COLOR_GREEN;
		afficher_barre_chargement('m', 15, "Chargement du jeu...", "Initialisation de curses : réussie", 100, barre_chargement);
	}

	afficher_barre_chargement('m', 15, "Chargement du jeu...", "Initialisation de la console", 100, barre_chargement);
#ifdef WIN32
	char titre[100] = "title Les Jeux Indemodables Ver.";
	strcat(titre, version_jeu);
	system(titre); //Remplace le nom du terminal
#endif
	curs_set(0);
	for(i = progression; (i + 5) != progression; progression++)
		barre_chargement[progression] = COLOR_GREEN;

	afficher_barre_chargement('m', 15, "Chargement du jeu...", "Chargement des sons", 100, barre_chargement);
	if(init_gest_sons() == false) {
		for(i = progression; (i + 5) != progression ; progression++)
			barre_chargement[progression] = COLOR_RED;
		beep();
		ret = 1;
	}
	else {
		for(i = progression; (i + 5) != progression; progression++)
			barre_chargement[progression] = COLOR_GREEN;
	}

	afficher_barre_chargement('m', 15, "Chargement du jeu...", "Vérification des dossiers", 100, barre_chargement);

	for(boucleVerif = 0; dossier_verif[boucleVerif] != NULL; boucleVerif++) {
		if(existe_folder(dossier_verif[boucleVerif])) {
			for(i = progression; (i + 5) != progression; progression++)
				barre_chargement[progression] = COLOR_GREEN;
			afficher_barre_chargement('m', 15, "Chargement du jeu...", NULL, 100, barre_chargement);
		}
		else {
			if(new_folder(dossier_verif[boucleVerif])) {
				for(i = progression; (i + 5) != progression ; progression++)
					barre_chargement[progression] = COLOR_GREEN;
				afficher_barre_chargement('m', 15, "Chargement du jeu...", NULL, 100, barre_chargement);
			}
			else {
				for(i = progression; (i + 5) != progression; progression++)
					barre_chargement[progression] = COLOR_RED;
				afficher_barre_chargement('m', 15, "Chargement du jeu...", NULL, 100, barre_chargement);

				beep();
				mvprintw(y, 0, "%s est introuvable et ne peut pas être créé!", dossier_verif[boucleVerif]);
				y++;
				afficher_temps(39, 0, 1, 500);
				ret = 1;
			}
		}
	}

	afficher_barre_chargement('m', 15, "Chargement du jeu...", "Vérification des fichiers", 100, barre_chargement);
	for(boucleVerif = 0; fichier_verif[boucleVerif] != NULL; boucleVerif++) {
		if(fichier_existe(fichier_verif[boucleVerif]) == false) {
			for(i = progression; (i + 5) != progression ; progression++)
				barre_chargement[progression] = COLOR_RED;
			afficher_barre_chargement('m', 15, "Chargement du jeu...", NULL, 100, barre_chargement);

			beep();
			mvprintw(y, 0, "%s est introuvable !", fichier_verif[boucleVerif]);
			y++;
			afficher_temps(22, 'm', 1, 500);
			ret = 1;
		}
		else {
			for(i = progression; (i + 5) != progression; progression++)
				barre_chargement[progression] = COLOR_GREEN;
			afficher_barre_chargement('m', 15, "Chargement du jeu...", NULL, 100, barre_chargement);
		}
	}

	afficher_barre_chargement('m', 15, "Chargement du jeu...", "Lecture des configurations", 100, barre_chargement);

	lire_conf();
	srand(time(NULL));
	for(i = progression; (i + 5) != progression; progression++)
		barre_chargement[progression] = COLOR_GREEN;


	if(verif_maj_start) {
		afficher_barre_chargement('m', 15, "Chargement du jeu...", "Vérification des mises à jours", 100, barre_chargement);

		if(!http_get_file("les-indemodables.googlecode.com", "/hg/src/version.txt", "version.txt", 'm', 9)) {
			for(i = progression; (i + 3) != progression; progression++)
				barre_chargement[progression] = COLOR_GREEN;

			info_verif_maj(info_maj, NULL);

			for(i = progression; (i + 2) != progression; progression++)
				barre_chargement[progression] = COLOR_GREEN;
		}
		else {
			for(i = progression; (i + 5) != progression; progression++)
				barre_chargement[progression] = COLOR_RED;
			beep();
			mvaddstr(y, 0, "Vérification des mises à jour impossibles!");
			y++;
			afficher_temps(39, 0, 1, 500);
		}
	}
	else {
		for(i = progression; (i + 5) != progression; progression++)
			barre_chargement[progression] = COLOR_GREEN;
		CSLP_ColorText(COLOR_YELLOW);
		mvaddstr(y, 0, "Mises à jour non vérifiées !");
		CSLP_ColorText(COLOR_WHITE);
		y++;
	}


	if(ret) {
		afficher_barre_chargement('m', 15, "Lancement du jeu... " , "/!\\ CHARGEMENT TERMINÉ AVEC DES ERREURS! /!\\", 100, barre_chargement);
		CSLP_Sleep(5000);
	}
	else if(!ret) {
		afficher_barre_chargement('m', 15, "Lancement du jeu... " , "CHARGEMENT TERMINÉ AVEC SUCCÉS!", 100, barre_chargement);
		CSLP_Sleep(250);
	}

	if(animations_bienvenue_fin) {
		clear();
		bienvenue_1(info_maj);
	}

	return ret;
}

void afficher_barre_chargement(short x, short y, const char *titre, const char *cs, short taille_barre, short chargement[taille_barre]) {
	short i = 0;

	if(titre != NULL) {
		move(y, x);
		CSLP_ColorText(COLOR_WHITE);
		afficher_sous_titre(titre , false);
		y += 4;
	}

	if(x == 'm') {
		x = x_begin_center(taille_barre);
	}

	move(y, x);
	i = 0;

	for(i = 0; i != (taille_barre + 2); i++) {
		CSLP_ColorText(COLOR_WHITE);
		addstr("▄");
	}
	y++;

	move(y, x);
	afficher_char_fullblock(1, COLOR_WHITE);
	for(i = 0; i != taille_barre; i++) {
		afficher_char_fullblock(1, chargement[i]);
	}
	afficher_char_fullblock(1, COLOR_WHITE);
	y++;
	move(y, x);
	i = 0;

	for(i = 0; i != (taille_barre + 2); i++) {
		CSLP_ColorText(COLOR_WHITE);
		addstr("▀");
	}

	if(cs != NULL) {
		y += 3;
		move(y, 0);
		insertln();
		insertln();
		afficher_centre(cs);
	}
	refresh();
}
